package archivos;

import graphs.GraphADT;
import java.io.IOException;
import java.io.Writer;
import java.util.List;

/**
 * @file Json.java
 * @author Juan Humanes Ferrer
 * @date 04-Marzo-2014
 * @description Clase para crear un archivo JSON
 */
public class Json {

    /**
     * Método que crea un archivo Json a partir de diferentes parámetros
     *
     * @param grafo: Grafo a pintar
     * @param titulo: Titulo del fichero
     * @param pw: Instancia de out
     * @throws IOException
     */
    public static void crearArchivoJsonUsuario(GraphADT grafo, String titulo, Writer pw) throws IOException {
        try {

            if (grafo != null) {

                if (titulo.contains("/")) {
                    String[] a = titulo.split(" ");
                    titulo = a[0];
                }

                boolean[][] adjMatrix = grafo.getAdjMatrix();
                List<String> listaVertices = grafo.getVertices();
                pw.flush();
                pw.write("{");
                pw.write("\"nodes\": [");
                pw.flush();

                //Se imprimen todos los elementos de la lista
                for (int i = 0; i < listaVertices.size(); i++) {
                    pw.flush();
                    int count = 500;
                    int lirika = 200;
                    int epika = 300;
                    int dramat = 400;
                    if (i == listaVertices.size() - 1) {
                        pw.flush();
                        pw.write("{\n"
                                + "      \"count\": " + count + ",\n"
                                + "      \"epika\": " + epika + ",\n"
                                + "      \"name\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"liryka\": " + lirika + ",\n"
                                + "      \"display\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"display_en\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"dramat\": " + dramat + "\n"
                                + "    }");
                        pw.flush();
                    } else {
                        pw.write("{\n"
                                + "      \"count\": " + count + ",\n"
                                + "      \"epika\": " + epika + ",\n"
                                + "      \"name\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"liryka\": " + lirika + ",\n"
                                + "      \"display\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"display_en\": \"" + listaVertices.get(i) + "\",\n"
                                + "      \"dramat\": " + dramat + "\n"
                                + "    },");
                        pw.flush();
                    }

                }
                pw.flush();
                pw.write("],");

                //Se recorre la matriz para saber cual es el ultimo enlace
                int contEnlacesI = 0;
                int contEnlacesJ = 0;

                for (int i = 0; i < listaVertices.size(); i++) {
                    for (int j = 0; j < i; j++) {
                        if (i != j) {
                            if (adjMatrix[i][j] == true) {
                                contEnlacesI = i;
                                contEnlacesJ = j;
                            }
                        }
                    }
                }

                //Se imprimen los enlaces
                pw.flush();
                pw.write("\"links\": [");
                pw.flush();
                for (int i = 0; i < listaVertices.size(); i++) {

                    for (int j = 0; j < i; j++) {

                        if (i != j) {

                            if (adjMatrix[i][j] == true) {
                                double grosorLinea = 0.76542;
                                if (i == contEnlacesI && j == contEnlacesJ) {
                                    pw.flush();
                                    pw.write("{\n"
                                            + "      \"count\": 100,\n"
                                            + "      \"source\": " + i + ",\n"
                                            + "      \"strength\": " + grosorLinea + ",\n"
                                            + "      \"target\": " + j + "\n"
                                            + "    }");
                                    pw.flush();
                                } else {
                                    pw.flush();
                                    pw.write("{\n"
                                            + "      \"count\": 100,\n"
                                            + "      \"source\": " + i + ",\n"
                                            + "      \"strength\": " + grosorLinea + ",\n"
                                            + "      \"target\": " + j + "\n"
                                            + "    },");
                                    pw.flush();
                                }
                            }
                        }
                    }

                    pw.flush();
                }

                pw.flush();
                pw.write("]");
                pw.flush();
                pw.write("}");
                pw.flush();

            } else {
            }
        } catch (IOException e) {
        }
    }

}
